import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report, roc_auc_score, roc_curve


def sep(label=''):
    """Utility function to print separator line."""
    print('-' * 32, label, '-' * 32, sep='')


# 4.	针对多项式朴素贝叶斯进行分析（25分）
# (1)	数据读取
# ①	读取数据信息（2分）
sep('①	读取数据信息')
df = pd.read_csv(r'../../../large_data/ML2/monthly_exam/bayes_lihang.txt')
m, n = df.shape
print(m, n)
print(df[:5])

# ②	将数据切分特征和标签，最后一列为标签（2分）
sep('②	将数据切分特征和标签，最后一列为标签')
x = df.iloc[:, :-1]
y = df.iloc[:, -1]
print(x[:5])
print(y[:5])

# (2)	数据预处理
# ①	将字符特征进行标签化处理（2分）
sep('①	将字符特征进行标签化处理')
enc = LabelEncoder()
x.iloc[:, 1] = enc.fit_transform(x.iloc[:, 1])
print(x[:5])

# (3)	模型处理
# ①	创建合理朴素贝叶斯函数（2分）
model = MultinomialNB()

# ②	训练模型，打印预测结果（2分）
sep('②	训练模型，打印预测结果')
model.fit(x, y)
h = model.predict(x)
print(h)

# ③	打印测试集预测概率（3分）
sep('③	打印测试集预测概率')
proba = model.predict_proba(x)
print(proba)

# (4)	模型评测
sep('(4)	模型评测')
# ①	打印accuracy（3分）
print(f'accuracy: {accuracy_score(y, h)}')

# ②	打印classfication_report（3分）
print('classfication_report')
print(classification_report(y, h))

# ③	打印roc曲线（3分）
fpr, tpr, thre = roc_curve(y, proba[:, 1])
plt.title('ROC')
plt.plot(fpr, tpr)
for i, th in enumerate(thre):
    plt.annotate(f'{th:.2f}', xy=[fpr[i], tpr[i]])

# ④	打印auc数值（3分）
print(f'auc: {roc_auc_score(y, proba[:, 1])}')

# Finally show all plotting
plt.show()
